import Config from '../application';
import Http from './http';
import http from './http';
import util from "./util";

/**
 * 百度AI平台认证相关的信息，信息配置在application.js中
 * @type {{clientId: *, apiKey: string, secretKey: string, appId: string, clientSecret}}
 */
const baiduInfo = {
	// app id
	appId: Config.baidu.config.appId,
	// 应用的API Key
	apiKey: Config.baidu.config.apiKey,
	// 必须参数，应用的Secret Key；
	secretKey: Config.baidu.config.secretKey
}

/**
 *
 * 该接口主要存储以下信息
 * 1.存储百度OAuth认证成功的token
 * 2.存储Token认证成功的时间
 * 3.存储Token的有效期
 * 4.实时检查该Token是否还在有效期内
 *
 * 百度接口调用凭证
 */
const accessTokenObj ={
	// token
	accessToken: null,
	// 颁发时间
	issuingTime: null,
	// 有效期，毫秒单位
	validPeriod: null,
	// 获取当前 token是否过期
	isExpired(){
		// 任意为空，就是过期
		if(!this.issuingTime || !this.accessToken || !this.validPeriod){
			return true;
		}
		// 颁发时间得时间戳
		const issuanceTimestamp = this.issuingTime.getTime();
		// 到期时间的时间戳
		const expirationTimestamp = issuanceTimestamp + this.validPeriod;
		// 当前时间的时间戳
		const timestampOfTheCurrentTime = new Date().getTime();

		// 到期时间已经过了  已经是过期的
		return timestampOfTheCurrentTime >= expirationTimestamp;
	}
};

/**
 * 该函数做了两件事情
 *  * 1.调用前先检查之前是不是之前有通过百度的OAuth认证，已经通过，就把通过认证的Token直接丢进 承诺对象 (Promise)并返回
 *  * 2.如果没有通过（即token不存在或者已经过期），先去通过本次认证，拿到新的Token，然后存起来，之后返回承诺对象，携带的诺言是Token
 *
 * 如何校验这个凭证还在呢？
 * 1.上面声明的accessTokenObj对象是存在的，不是null或者undefined
 * 2.实时获取的状态isExpired函数返回值是false
 *
 *  获取Access Token
 */
function getAccessToken() {
	return new Promise((resolve, reject) => {
		if (!accessTokenObj || accessTokenObj.isExpired()) {
			const grantType = 'client_credentials';
			const clientId = baiduInfo.apiKey;
			const clientSecret = baiduInfo.secretKey;
			const url = 'https://aip.baidubce.com/oauth/2.0/token?';
			const param = `grant_type=${grantType}&client_id=${clientId}&client_secret=${clientSecret}`;
			http.get(url + param, (res) => {
				// 拿到响应数据
				const data = res.data;

				// 获取到的token
				const accessToken = data.access_token;
				// token 有效期，秒
				const expiresIn = data.expires_in;
				accessTokenObj.issuingTime = new Date();
				accessTokenObj.accessToken = accessToken;
				accessTokenObj.validPeriod = expiresIn * 1000;

				resolve(accessToken);
			},(res)=>{
				reject(res);
			});
			return;
		}
		resolve(accessTokenObj.accessToken);
	});
}

/**
 *
 * 该接口分以下两步:
 *  1.先去获取调用百度接口的权限，及OAuth认证，认证成功会返回凭证，即:accessToken
 *  2.第一步成功后才能进行该步骤，接着调用图片上色接口
 *
 * 黑白图片上色
 * @param imgData
 * @param success
 *                      log_id	是	uint64	唯一的log id，用于问题定位
 *                      image	否	string	base64编码图片
 * @param fail
 * @param complete
 */
export function colouring(imgData){
	return new Promise((resolve, reject) => {
		// 获取token
		getAccessToken()
			.then(accessToken=>{
				console.log('token',accessToken)
				// 此处开始调用百度黑白图像上色接口
				const url = 'https://aip.baidubce.com/rest/2.0/image-process/v1/colourize?access_token=';
				Http.postOfXWWWFormUrlEncoded(url + accessToken,{
					image: imgData
				},(res)=>{
					resolve(res);
				},(res)=>{
					reject(res);
				});
			}).catch(error=>{
				util.openErrorToast('百度AI平台OAuth失败!');
		});
	});
}


/**
 * 该接口分以下两步:
 *  1.先去获取调用百度接口的权限，及OAuth认证，认证成功会返回凭证，即:accessToken
 *  2.第一步成功后才能进行该步骤，接着调用图片转换接口
 *
 *
 * 图像风格转换
 * @param imgData
 * @param option
 * @param success
 *                      log_id	是	uint64	唯一的log id，用于问题定位
 *                      image	否	string	base64编码图片
 * @param fail
 * @param complete
 * @returns {Promise}  承诺对象
 */
export function convert(imgData,option){
	return new Promise((resolve, reject) => {
		getAccessToken()
			.then(accessToken=>{
				// 开始调用百度图像转换接口
				const url = 'https://aip.baidubce.com/rest/2.0/image-process/v1/style_trans?access_token='
				Http.postOfXWWWFormUrlEncoded(url + accessToken,{
					// 要转换的图片数据
					image: imgData,
					// 转换成什么风格
					option: option
				},(res)=>{
					resolve(res);
				},(error)=>{
					reject(error);
				});
			}).catch(error=>{
			util.openErrorToast('百度AI平台OAuth失败!');
		});
	});
}
